<? 
/*
form_element Class

dit is de basis classe voor elk formulier element

@author		Jelle Versele
@email 		me@jelleversele.be

stelt een form element voor

*/

require_once('view/htmlTag.class.php');
require_once('form/validator.class.php');
require_once('form/filter.class.php');
require_once('form/group.class.php');
require_once('form/rule.class.php');
require_once('form/filterRule.class.php');
require_once('form/label.class.php');


class form_element{
	
	const GET = 'GET';
	const POST = 'POST';
	/*
	@var string
	*/
	protected $name;
	/*
	@var obj(label class)
	*/
	protected $label;
	/*
	@var array
	*/
	private $rules;
	/*
	@var array
	*/
	private $filters;
	/*
	@var string
	*/
	private $method;
	/*
	@var string
	*/
	protected $html;
	/*
	@var bool
	*/
	private $group;
	/*
	@var bool
	*/
	public $required;
	
	
	/*
		instantie aanmaken van de classe
		@param	string
	*/
	public function __construct($iName){
		
		$this -> name 		= (string) $iName;
		$this -> rules 		= array();
		$this -> errors 	= array();
		$this -> filters 	= array();
	
	}
	
	/*
	@method		geeft een array van regels (voor validate) terug
	*/
	public function getRules(){
		
		return $this -> rules;
	
	}
		/*
	@method		geeft een array van regels (voor validate) terug
	*/
	public function getFilters(){
	
		return $this -> filters;
	
	}
	/*
	@method		getter voor label
	*/
	public function getLabel(){
	
		return $this -> label;
	
	}
	
	/*
	@method		getter voor naam
	*/
	public function getName(){
	
		return $this -> name;
	
	}
	
	/*
	@method		haalt de verzonden waardes van de formulier elementen op
	*/
	
	public function getSendVar(){
	
		if(isset($this -> method)){
	
			switch($this -> method){
	
				case 'POST':
					if(isset($_POST[$this -> name])){
						return $_POST[$this-> name];
					}else{
						return NULL;
					}
				break;
	
				case 'GET':
					if(isset($_GET[$this -> name])){
							return $_GET[$this-> name];
						}else{
							return NULL;
						}
				break;
				
			}	
		}else{
		
			throw new Exception("POST or GET var doesn't exists for this element");
		}
	}
	
	/*
	@method		haalt gegevens op een haalt ze door een filter indien nodig
	*/
	
	public function getSend(){
		if(count($this -> filters) > 0){
			
			$formFilter = form_filter::getInstance();
			
			return $formFilter->filter($this);
			
		}else{	
			return $this -> getSendVar();
		}
	}
	
	/*
	@method		haalt instantie van de validator classe op en voert validatie uit
	*/
	public function validate(){
		
		// validator instantie ophalen
		$validator = form_validator::getInstance();
		// valideren
		$validator -> validate($this);
			
	}
	
	/*
	@method		controleert of er geen enkele regel overtreden is 
	*/
	public function isValid(){
		
		$bool = true;
		
		$this -> validate();
	
		foreach($this -> rules as $rule){
		
			if($rule -> triggered()){
				
				$bool = false;
				break;
				
			}
			
		}
		return $bool;
	}
	
	/*
	@method		geeft de errors terug 
	@param 		bool	als deze op true staat geeft hij enkel de eerste error terug
	*/
	public function getErrors($singleError = false){
		$errors = array();
		
		if($this-> isValid()){
			return $errors;
		}else{
			
			
			foreach($this -> rules as $rule){
			
				if($rule -> triggered()){
				
					$errors [] = $rule -> getMessage();
				
				}
			
			} 
			
			if($singleError){
				return $errors[0];
			}else{
				return $errors;
			}
		}
	
	
	}	
	
	/*
	@method		rule toevoegen voor validatie
	@param		string		conditie moet een public static function zijn in de validator classe
	@param 		string		fout bericht dat moet worden weergegeven als niet aan de validatie wordt voldaan
	*/
	public function addRule($iCondition, $iMessage,array $args = NULL,$bool = false){
		
		if($iCondition == 'notNull' || $iCondition == 'minMax'){
			$this -> required = true;
		}
		
		$this -> rules[] = new form_rule($iCondition, $iMessage, $args, $bool);
	}
	
	
	public function addRules(array $iRules){
	
		foreach($iRules as $rule){
			switch(count($rule)){
				case 2:
					$this -> addRule($rule[0], $rule[1]);
				break;
				case 3:
					$this -> addRule($rule[0], $rule[1], $rule[2]);
				break;
				case 4:
					$this -> addRule($rule[0], $rule[1], $rule[2]);
				break;
			}	
		}
	}
	
	/*
	@method		een label toevoegen, maakt een nieuw label object aan 
	@param		string		waarde voor het label
	*/
	public function addLabel($iValue){
				
		$this -> label = new form_label($iValue, $this -> name);
		
	}
	
	/*
	@method		methode voor het element vastzetten
	@param		string		moet POST of GET zijn 
	*/
	public function setMethod($iMethod){
		
		if($iMethod == self::POST || $iMethod == self::GET){
			$this -> method = (string) $iMethod;
		}else{
			throw new Exception("Mehtod must be POST OR GET");
		}
	}
	
	/*
	@method		toevoegen van een filter
	@param		string		filter moet wel een function zijn in de klasse form_filter
	*/
	public function addFilter($iName, $iArgs = NULL){
	
		$this -> filters[] = new form_filterRule($iName, $iArgs);
	
	}
	
	/*
	@method		ophalen van het HTML object
	*/
	public function getHtml(){
	
		return $this -> html;
	
	}
	
	/*
	@method		value zetten
	@param 		string
	*/
	public function setValue($iValue){
	
		$this -> html -> setAttribute('value', $iValue);
	}
	
	/*
	@method		de elementen zitten in een groep
	*/
	public function setGroup(){
	
		$this -> group = true;
	}
	
	/*
	@method		zitten de elementen in een groep?
	*/
	public function isGroupt(){
	
		return $this -> group;
	}
	
	public function render(){
	
	
		return $this -> html -> render();
	
	}
	

}

?> 